package com.xbongbong.paas.service.abstracts;

import com.xbongbong.i18n.util.I18nMessageUtil;
import com.xbongbong.paas.constant.TimeConstant;
import com.xbongbong.paas.log.MongoLogHelp;
import com.xbongbong.paas.log.constant.LogMemoConstant;
import com.xbongbong.paas.redis.PaasRedisHelper;
import com.xbongbong.paas.redis.RedisConstant;
import com.xbongbong.paas.service.PaasCompanyConfigService;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.companyconfig.pojo.dto.CompanyConfigEnableDTO;
import com.xbongbong.pro.companyconfig.pojo.vo.CompanyConfigEnableVO;
import com.xbongbong.pro.enums.errorcodes.SystemErrorCodeEnum;
import com.xbongbong.saas.constant.BasicConstant;
import com.xbongbong.saas.constant.StringConstant;
import com.xbongbong.saas.enums.CompanyConfigEnum;
import com.xbongbong.saas.enums.OperateModuleTypeEnum;
import com.xbongbong.saas.enums.OperateTypeEnum;
import com.xbongbong.sys.domain.entity.CompanyConfigEntity;
import com.xbongbong.sys.model.CompanyConfigModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * @author 吴峰
 * @date 2023/02/06 14:41
 */
@Slf4j
@Component
public abstract class AbstractPaasCompanyConfigService implements PaasCompanyConfigService {

    @Resource
    private MongoLogHelp mongoLogHelp;
    @Resource
    private CompanyConfigModel companyConfigModel;
    @Resource
    private PaasRedisHelper paasRedisHelper;

    @Override
    public CompanyConfigEnableVO enable(CompanyConfigEnableDTO companyConfigEnableDTO) throws XbbException {
        CompanyConfigEnableVO companyConfigEnableVO = new CompanyConfigEnableVO();
        String corpid = companyConfigEnableDTO.getCorpid();
        String userId = companyConfigEnableDTO.getUserId();
        // 登录用户名
        String loginUserName = companyConfigEnableDTO.getLoginUserName();
        String enable = companyConfigEnableDTO.getValue();
        String alias = companyConfigEnableDTO.getAlias();

        // 过虑不正确的值
        enable = BasicConstant.IS_USE.toString().equals(enable) ? enable : BasicConstant.NO_USE.toString();
        CompanyConfigEnum configEnum = CompanyConfigEnum.getByAlias(alias);
        if (configEnum == null) {
            throw new XbbException(SystemErrorCodeEnum.API_ERROR_100088);
        }
        CompanyConfigEntity companyConfigEntity;
        try {
            companyConfigEntity = companyConfigModel.getByConfigAlias(alias, corpid);
            if (companyConfigEntity == null) {
                companyConfigEntity = new CompanyConfigEntity(corpid, configEnum.getName(), alias, configEnum.getValue());
                companyConfigModel.insert(companyConfigEntity);
            }
            companyConfigEntity.setConfigValue(enable);
            companyConfigModel.update(companyConfigEntity);
        } catch (XbbException e) {
            throw e;
        } catch (Exception e) {
            log.error("启用/关闭公司配置失败", e);
            throw new XbbException(SystemErrorCodeEnum.API_ERROR_100001, SystemErrorCodeEnum.API_ERROR_100001.getMsg());
        }

        // 缓存
        String key = corpid + StringConstant.COLON + alias;
        paasRedisHelper.setValue(RedisConstant.KEY_COMPANY_CONFIG, key, enable,
                TimeConstant.SECONDS_EIGHT_HOUR);

        // 日志
        String memo;
        OperateTypeEnum operateTypeEnum;
        if (Objects.equals(BasicConstant.IS_USE.toString(), enable)) {
            operateTypeEnum = OperateTypeEnum.ENABLE;
            memo = String.format(I18nMessageUtil.getMessage(LogMemoConstant.LOG_MEMO_OPEN_COMPANY_CONFIG), loginUserName, configEnum.getName());
        } else {
            operateTypeEnum = OperateTypeEnum.CLOSE;
            memo = String.format(I18nMessageUtil.getMessage(LogMemoConstant.LOG_MEMO_CLOSE_COMPANY_CONFIG), loginUserName, configEnum.getName());
        }
        mongoLogHelp.buildLog(corpid, userId, loginUserName, OperateModuleTypeEnum.COMPANY_CONFIG, operateTypeEnum, companyConfigEntity.getId().toString(), OperateModuleTypeEnum.COMPANY_CONFIG.getName(), memo, companyConfigEnableDTO.getHttpHeader());

        return companyConfigEnableVO;
    }
}
